# 导包
import pymysql


# 创建类
class DBUtil:
    # 初始化
    __conn = None
    __cursor = None

    # 创建连接
    @classmethod
    def __get_conn(cls):
        # 当conn连接对象不存在时，再使用pymysql创建连接对象，返回创建的conn对象给方法调用出
        # 当conn连接对象存在时，直接返回调用方法处
        if cls.__conn is None:
            cls.__conn = pymysql.connect(host="127.0.0.1",
                                         port=3306,
                                         user="root",
                                         password="123456",
                                         database="books",
                                         charset="utf8")
        return cls.__conn

    # 获取游标
    @classmethod
    def __get_cursor(cls):
        if cls.__cursor is None:
            # 通过调用创建连接方法，来确保一定能获取到连接对象
            cls.__cursor = cls.__get_conn().cursor()
        return cls.__cursor

    # 执行sql
    @classmethod
    def exe_sql(cls, sql):
        try:
            cursor = cls.__get_cursor()
            cursor.execute(sql)
            # 查询    返回查询结果
            if sql.split()[0].lower() == "select":
                return cursor.fetchall()
            # 非查询  提交事务       返回统计的数据行数
            else:
                cls.__conn.commit()
                return cursor.rowcount
        except Exception as e:
            # 回滚事务
            cls.__conn.rollback()
            # 抛出异常
            print(e)
        finally:
            cls.__close_cursor()
            cls.__close_conn()

    # 关闭游标
    @classmethod
    def __close_cursor(cls):
        if cls.__cursor:
            cls.__cursor.close()

    # 关闭连接
    @classmethod
    def __close_conn(cls):
        if cls.__conn:
            cls.__conn.close()
